perm filename YEAR.SAI[1,BGB] blob
sn#053577 filedate 1973-07-14 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "YEAR"
C00005 00003 α SUBROUTINES OTIME, TOTAL, PRNTOT
C00007 00004 α HEAP SORT
C00011 00005 α FILE OPENING CEREMONIES
C00015 00006 α SCAN'A'LINE OF INPUT LOOP
C00018 00007 α ACCUMULATE GRAND TOTALS
C00021 00008 α PRINT THE CLASS CPU TIME TOTALS
C00023 00009 α SORT ON EACH DATA FIELD
C00026 ENDMK
C⊗;
BEGIN "YEAR"
REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
REQUIRE 2000 NEW_ITEMS;
REQUIRE 2000 PNAMES;
DEFINE SUBR="SIMPLE PROCEDURE";
α IO VARIABLES;
INTEGER CNT,BRK,EOF,CHR,FLG,I,J;
STRING LINE;
INTEGER ITEMVAR IPROG;
INTEGER BUG;
α DECLARE ALL THEM PROGRAMMERS;
INTEGER ITEM PM,REB,GAR,GUE,WAP,RCB,CCC,DCL,JJM,JRA,
JWG,MBS, CT,RS1,SLM,BMJ,SUZ,PAM,PMK,ROG,CKR,NMG,NJM,THO,
MIB,EMC,JMG,MUZ,MUS,TVR,JBR,KVL,ALS,
SYS,REG,JRL,JAM,PJS,SRS,
JHS,DCS,RHT,TES,EHS,JOE,
GJG,AIL,AKC, WD,CCG,IGR,
RLL, ZM,JMC,RGM,SAN,MAL,
BWP,JEV,RWW,PDQ, BO,RBT,
MJH,PLF, SL,JGC,BLF, AH,
MHR,CJR,YAW,GJA,TOB,SHY,
YYY, GG,RKN,RPO,LOU,KKP,
VDS,JAF,BGB,AKI,AJT,DFD,
RPH,H,FW,ELM,PMP,DWP,MJW,TED,
GHB,DGB,KMC,KRD,HJE,ME,FDH,
TM1,HPM,VRP,EDS,DAV,JYS,JRB;
α DECLARE MAJOR GROUPS;
SET MUSIC,MARS,ROBOTS,SYSTEMS,MTC,HMF,FOONLY,OTHERS,MT,SPEECH;
DEFINE MUSIC#="1", MARS#="2", ROBOTS#="3", SYSTEMS#="4",
MTC#="5", HMF#="6", FOONLY#="7", MT#="8", SPEECH#="9", OTHERS#="10";
α YEAR TIL DATE DATA FOR EACH PPPN;
DEFINE SIZ = "2000";
SAFE ITG ARRAY PRJ,LOG,TTY,CPU,KCS[1:SIZ],PRG[0:SIZ];
SAFE ITG ARRAY TTY#,CPU#,KCS#[1:SIZ];
INTEGER K,L,M;
INTEGER PPNCNT;
INTEGER ARRAY CLASS[1:500]; α LIKE SCHOOL...;
SUBR OSTR (STRING S); ⊂ OUTSTR(S);OUT(2,S) ⊃;
α SUBROUTINES OTIME, TOTAL, PRNTOT;
α __________________________________________________________________;
SUBR OTIME (INTEGER MINUTES);
BEGIN "OTIME"
INTEGER DAYS,HOURS,MINS;
MINS ← MINUTES MOD 60;
HOURS ← (MINUTES DIV 60) MOD 24;
DAYS ← MINUTES DIV (24*60);
SETFORMAT(4,7); OSTR(CVS(DAYS)&" DAYS ");
SETFORMAT(2,7); OSTR(CVS(HOURS)&":");
SETFORMAT(-2,7);OSTR(CVS(MINS));
END "OTIME";
α __________________________________________________________________;
INTEGER X1,X2,X3;
SUBR TOTAL (INTEGER I);
BEGIN
TTY[I]←TTY[I]+X1;
CPU[I]←CPU[I]+X2;
KCS[I]←KCS[I]+X3;
END;
α __________________________________________________________________;
SUBR PRNTOT (INTEGER I; SET S; STRING STR);
BEGIN
ITEMVAR IPROG;
OSTR(↓&STR&" TOTALS."&↓);
∀ IPROG|IPROGεS DO OSTR(CVIS(IPROG,FLG)&"," );OSTR(↓);
OSTR(" CPU TIME ");
OTIME(CPU[I]%60);
OSTR(9&9&CVS(100*CPU[I]%CPU[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(" "&CVS(KCS[I])&" KILO CORE SECONDS");
OSTR(9&9&CVS(100*KCS[I]%KCS[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(" CONSOLE TIME ");
OTIME(TTY[I]);
OSTR(9&9&CVS(100*TTY[I]%TTY[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(↓);
END;
α __________________________________________________________________;
α HEAP SORT;
α ARRAY-A ARE THE KEYS, ARRAY-B ARE THE RECORDS;
α __________________________________________________________________;
SUBR HEAP1D (ITG ARRAY A,B; INTEGER N);
BEGIN "HEAPSORT"
ITG I,J,K,X,Y;
α PUT'EM UNDER THE HEAP & ALLOW THE BIGGIES TO TRICKLE UP;
FOR K←2 STEP 1 UNTIL N DO
BEGIN
I←K;
X←A[I]; Y←B[I];
WHILE I>1 ∧ X>A[J←I%2] DO
BEGIN A[I]←A[J];B[I]←B[J];I←J END;
A[I]←X;B[I]←Y;
END;
α TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;
FOR K←N STEP -1 UNTIL 2 DO
BEGIN
X←A[K];Y←B[K];A[K]←A[1];B[K]←B[1];I←1;
WHILE (J←2*I)<K DO
BEGIN
IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
IF X≥A[J] THEN DONE ELSE
⊂ A[I]←A[J];B[I]←B[J];I←J ⊃;
END;
A[I]←X;B[I]←Y;
END;
END "HEAPSORT";
α __________________________________________________________________;
α FILE OPENING CEREMONIES;
OPEN(2,"DSK",0,0,3,0,0,0);ENTER(2,"O",0);
OPEN(1,"DSK",0,3,0,CNT,BRK,EOF);
⊂ STRING FILNAM; OUTSTR(" YTD OR MONTH NAME = ");
FILNAM ← INCHWL;
LOOKUP(1,FILNAM,FLG);
IF FLG THEN LOOKUP(1,FILNAM&"[ACT,SYS]",FLG);
IF FLG THEN ⊂ FILNAM←"YTD";
LOOKUP(1,"YTD[ACT,SYS]",FLG) ⊃;
OSTR(↓&↓&"YEAR TO DATE ANALYSIS OF FILE ");
OSTR(FILNAM&↓&↓);⊃;
α DECLARE SCAN BREAK CHARACTERS;
BREAKSET(1,13,"I");
BREAKSET(1,10,"O");
FOR I←1 TIL 6 DO ⊂ CNT←120;LINE←INPUT(1,1) ⊃;
BREAKSET(2, 9,"I");
BREAKSET(2," ","O");
BREAKSET(3,",]","I");
BREAKSET(3,"[","O");
α PROJECT GROUPS;
MUSIC ← {PM,REB,GAR,JWG,MBS,CT,RS1,SLM,BMJ,JAM,
MIB,EMC,JMG,MUZ,MUS};
SYSTEMS←{SYS,REG,JRL,PJS,SRS,DCS,FW,AIL,GUE,RHT,TES};
MTC←{AKC,WD,CCG,IGR,RLL,ZM,JMC,RGM,SAN,MAL,
BWP,JEV,RWW,DCL,JJM,JRA,SUZ};
MARS←{PDQ,BO,RBT,MJH,PLF,SL};
ROBOTS←{GJA,TOB,SHY,GG,YYY,RKN,RPO,LOU,KKP,TVR,WAP,RCB,CCC,
JOE,VDS,JAF,BGB,AKI,AJT,DFD};
FOONLY←{RPH,H,ELM,PMP,DWP,MJW,TED,EHS};
HMF←{GHB,DGB,KMC,KRD,HJE,FDH,TM1,HPM,VRP,
CKR,EDS,ROG,DAV,JYS,JRB};
MT←{JGC,BLF,AH,MHR,CJR,YAW,PAM,PMK,ROG,CKR,NMG};
SPEECH←{ALS,NJM,THO};
α ASSIGN PROJECT SERIAL NUMBERS;
∀ IPROG | IPROGεMUSIC DO ∂(IPROG) ← SIZ - MUSIC#;
∀ IPROG | IPROGεSPEECH DO ∂(IPROG) ← SIZ - SPEECH#;
∀ IPROG | IPROGεMARS DO ∂(IPROG) ← SIZ - MARS#;
∀ IPROG | IPROGεSYSTEMS DO ∂(IPROG) ← SIZ - SYSTEMS#;
∀ IPROG | IPROGεROBOTS DO ∂(IPROG) ← SIZ - ROBOTS#;
∀ IPROG | IPROGεMTC DO ∂(IPROG) ← SIZ - MTC#;
∀ IPROG | IPROGεHMF DO ∂(IPROG) ← SIZ - HMF#;
∀ IPROG | IPROGεFOONLY DO ∂(IPROG) ← SIZ - FOONLY#;
∀ IPROG | IPROGεMT DO ∂(IPROG) ← SIZ - MT#;
α SCAN'A'LINE OF INPUT LOOP;
WHILE TRUE DO
BEGIN "INPUT SCAN"
STRING LINE,PPNSTR,PJSTR,PGSTR,LOGSTR,TTYSTR,CPUSTR,KCSSTR;
INTEGER PROGMR,PROJCT;
α READ'A'LINE;
CNT←120;LINE←INPUT(1,1);
IF EOF THEN DONE;
α READ THE PPPN - [PRJ,PRG];
PPNSTR ← SCAN(LINE,2,CHR);
PJSTR ← SCAN(PPNSTR,3,CHR); PROJCT ← INTSCAN(PJSTR,CHR);
PGSTR ← SCAN(PPNSTR,3,CHR); PROGMR ← CVSIX(PGSTR);
α DISTINGUISH A NEW MAN;
IF PROGMR≠PRG[M] THEN ⊂ PRG[M←M+1]←PROGMR; L←0; ⊃;
PRJ[M]←PRJ[M]+1;
L←L+1; PPNCNT←PPNCNT+1;
α READ PPPN'S STATISTICS: LOGINS, CONSOLE h:m, CPU m:s, KCS;
LOGSTR ← SCAN(LINE,2,CHR);
TTYSTR ← SCAN(LINE,2,CHR);
CPUSTR ← SCAN(LINE,2,CHR);
KCSSTR ← SCAN(LINE,2,CHR);
α ACCUMULATE INDIVIDUAL TOTALS;
LOG[M] ← LOG[M] + INTSCAN(LOGSTR,CHR);
X1 ← INTSCAN(TTYSTR,CHR)*60 + INTSCAN(TTYSTR,CHR);
X2 ← INTSCAN(CPUSTR,CHR)*60 + INTSCAN(CPUSTR,CHR);
X3 ← INTSCAN(KCSSTR,CHR);
TTY[M] ← TTY[M] + X1;
CPU[M] ← CPU[M] + X2;
KCS[M] ← KCS[M] + X3;
α ACCUMULATE CLASS TOTALS;
IF PROJCT≥1 ∧ PROJCT≤500 THEN
CLASS[PROJCT] ← CLASS[PROJCT] + X2;
α LOOKUP HIS GROUP NUMBER AND ACCUMULATE GROUP TOTALS;
IPROG ← CVSI(PGSTR,FLG);
IF FLG THEN TOTAL(SIZ-OTHERS#) ELSE TOTAL(∂(IPROG));
IF FLG THEN PRG[M]←CVSIX(PGSTR&" ?");
END "INPUT SCAN";
RELEASE(1);
OUTSTR("EOF"&↓);
α ACCUMULATE GRAND TOTALS;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+LOG[I]; LOG[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+TTY[I]; TTY[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+CPU[I]; CPU[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+KCS[I]; KCS[SIZ]←J;
α PRINT GRAND TOTALS;
OSTR("RAW GRAND TOTALS."&↓);
SETFORMAT(10,7);
OSTR(" "&CVS(M)&" PROGRAMMERS"&↓);
OSTR(" "&CVS(PPNCNT)&" PPPN'S"&↓);
OSTR(" "&CVS(LOG[SIZ])&" LOGIN'S"&↓);
OSTR(" CONSOLE TIME "&CVS(TTY[SIZ])&" MINUTES"&↓);
OSTR(" CPU TIME "&CVS(CPU[SIZ])&" SECONDS"&↓);
OSTR(" "&CVS(KCS[SIZ])&" KILO CORE SECONDS"&↓);
OSTR(↓);
OSTR("EQUIVALENT GRAND TOTALS."&↓);
OSTR(" CONSOLE TIME ");
OTIME(TTY[SIZ]); OSTR(↓);
OSTR(" CPU TIME ");
OTIME(CPU[SIZ]%60); OSTR(↓);
α PRINT THE GROUP TOTALS;
PRNTOT(SIZ-SYSTEMS#,SYSTEMS, "SYSTEMS AND NET");
PRNTOT(SIZ-ROBOTS#,ROBOTS, "ROBOTICS");
PRNTOT(SIZ-MUSIC#,MUSIC, "MUSIC");
PRNTOT(SIZ-FOONLY#,FOONLY, "FOONLY");
PRNTOT(SIZ-HMF#,HMF, "HIGHER MENTAL FUNCTIONS");
PRNTOT(SIZ-MTC#,MTC, "MATHEMATICAL THEORY OF COMPUTATION");
PRNTOT(SIZ-MT#,MT, "NATURAL LANGUAGE");
PRNTOT(SIZ-SPEECH#,SPEECH, "SPEECH");
PRNTOT(SIZ-MARS#,MARS, "MARS");
PRNTOT(SIZ-OTHERS#,OTHERS, "OTHERS");
α PRINT THE CLASS CPU TIME TOTALS;
OSTR(↓&"TOTAL CPU TIME BY NUMERIC PROJECTS 20 TIL 500"&↓);
OSTR(" which are alleged to be university course numbers."&↓);
FOR I←20 TIL 500 DO
IF CLASS[I]>60 THEN
BEGIN "CLASS"
INTEGER CPUTIM;
OSTR(9&"COURSE #"&CVS(I)&9);
CPUTIM←(CLASS[I])%60;
SETFORMAT(3,7);
OSTR(CVS(CPUTIM%60)&":");
SETFORMAT(-2,7);
OSTR(CVS(CPUTIM MOD 60));
IF I=220 THEN OSTR(9&"MUSIC") ELSE
IF I=206 THEN OSTR(9&"LISP") ELSE
IF I=390 THEN OSTR(9&"ADV READING & RESEARCH") ELSE
IF I=347 THEN OSTR(9&"HIGH SCHOOL HACKER - SMG") ELSE
IF I=225 THEN OSTR(9&"ARTIFICIAL INTELLIGENCE") ELSE
IF I=226 THEN OSTR(9&"REPRESENTATION IN A.I.") ELSE
IF I=256 THEN OSTR(9&"MATHEMATICAL THEORY OF COMPUTATION") ELSE
IF I=293 THEN OSTR(9&"COMPUTER LAB") ELSE
IF I=137 THEN OSTR(9&"NUMERICAL ANALYSIS") ELSE
IF I=140 THEN OSTR(9&"SYSTEMS PROGRAMMING") ELSE
IF I=144 THEN OSTR(9&"DATA STRUCTURES");
OSTR(↓);
END "CLASS";
α SORT ON EACH DATA FIELD;
FOR I←1 TIL M DO TTY#[I]←CPU#[I]←KCS#[I]←I;
HEAP1D(TTY,TTY#,M);
HEAP1D(CPU,CPU#,M);
HEAP1D(KCS,KCS#,M);
α TYPE OUT THE VILLAINS;
OSTR(↓&↓);
OSTR("THE RANK ORDER OF OUTSTANDING USERS"&↓);
OSTR(↓&"RANK CPU-TIME HR:MIN ");
OSTR(9&"KILO-CORE-SECONDS CONSOLE-TIME"&↓);
α OUTPUT A LINE OF RANK ORDER;
FOR I←M STEP -1 UNTIL M-200 DO
BEGIN "RANK'A'LINE"
INTEGER CPUTIM;
α RANK ORDER;
SETFORMAT(4,7);OSTR(CVS(M-I+1)&9);
α TOTAL CPU TIME;
OSTR(CVXSTR(PRG[CPU#[I]])&" ");CPUTIM←CPU[I]%60;SETFORMAT(3,7);
OSTR(CVS(CPUTIM%60)&":");SETFORMAT(-2,7);
OSTR(CVS(CPUTIM MOD 60)&9&9);
α KILO CORE SECONDS;
SETFORMAT(2,7);
OSTR(CVXSTR(PRG[KCS#[I]])&" ");
OSTR(CVS(KCS[I])&9&9);
α TOTAL CONSOLE TIME;
OSTR(CVXSTR(PRG[TTY#[I]])&" ");
OTIME((TTY[I]));
OSTR(↓);
END "RANK'A'LINE";
RELEASE(2);
OUTSTR(↓&9&"EOF"&↓);
END "YEAR";